import { ref, type Ref } from "vue";

// 定义 fetchDataFunction 的参数接口，为了参数清晰，保留
export interface FetchParams {
  [key: string]: any;
  page: number;
}

// 定义 useInfiniteScroll 的配置选项接口
export interface InfiniteScrollOptions {
  initialPage?: number;
  pageSize?: number;
}

/**
 * 通用的滚动加载 Hook (适用于 uni-app 的 onReachBottom 机制)
 *
 * @template T - 列表项的数据类型
 * @param {(params: API.PageParams) => Promise<API.PagedList<T>} fetchDataFunction - 用于获取数据的异步函数。
 * @param {InfiniteScrollOptions} [options] - 配置选项
 */
export function useInfiniteScroll<T>(fetchDataFunction: (params: FetchParams) => Promise<API.PagedList<T>>, options: InfiniteScrollOptions = {}) {
  const { initialPage = 1, pageSize = 10 } = options;

  /** 列表数据 */
  const items = ref<T[]>([]);
  /** 当前加载的页码 */
  const currentPage = ref(initialPage);
  /** 是否加载中 */
  const isLoading = ref(false);
  /** 是否还有更多数据可加载 */
  const hasMore = ref(true);
  /** 错误信息 */
  const error: Ref<string | null> = ref(null);
  /** 用于在外部触发额外参数的更新 */
  const otherQueryParams = ref({});

  /**
   * 加载更多列表数据
   */
  const loadMore = async () => {
    if (isLoading.value || !hasMore.value) {
      return; // 已经在加载中或者没有更多数据了
    }

    isLoading.value = true;
    error.value = null;

    try {
      // 调用传入的 fetchDataFunction
      const { list } = await fetchDataFunction({
        page: currentPage.value,
        limit: pageSize,
        ...otherQueryParams.value, // 传递额外参数
      });

      if (Array.isArray(list)) {
        (items.value as T[]).push(...list); // 追加数据
        // 根据返回数据量判断是否还有更多
        hasMore.value = list.length === pageSize;
        if (hasMore.value) {
          currentPage.value++; // 如果还有更多数据，则递增页码
        }
      } else {
        console.warn("fetchDataFunction did not return expected { data, hasMore } format.");
        hasMore.value = false; // 假设没有更多了
      }
    } catch (err: any) {
      error.value = err.message || "加载数据失败，请重试。";
      console.error("Error fetching data:", err);
    } finally {
      isLoading.value = false;
    }
  };

  /**
   * 重置列表并重新加载第一页数据
   * @param {Record<string, any>} [newQueryParams={}] - 新的查询参数
   */
  const resetAndLoad = async (newQueryParams: Record<string, any> = {}) => {
    items.value = [];
    currentPage.value = initialPage;
    hasMore.value = true;
    error.value = null;
    otherQueryParams.value = { ...newQueryParams };

    loadMore();
  };

  return {
    items,
    isLoading,
    hasMore,
    error,
    resetAndLoad,
    loadMore,
  };
}
